import compose from './compose';

/*
 * @description: applyMiddleware主要是合并传入的中间件，最后调用中间件，给中间件传入 dispatch方法，中间件返回一个加强后的dispatch
 */
export default function applyMiddleware(...middlewares) {
  return (createStore) => (reducer) => {
    const store = createStore(reducer);

    // 拿到普通的 dispatch 准备进行加强
    let dispatch = store.dispatch;

    // 提供两个方法给 中间件，让中间件能够干一些事情
    const middlewareApi = {
      dispatch: (action, ...args) => dispatch(action, ...args),
      getState: store.getState,
    };
    // 这里可以看到，中间件应该是拿到middlewareApi 后返回一个函数的，返回的函数才是真正的加强 dispatch 逻辑
    const chain = middlewares.map((middleware) => middleware(middlewareApi));

    // 在这里获取到加强版的 dispatch
    dispatch = compose(...chain)(dispatch);

    return {
      ...store,
      dispatch,
    };
  };
}
